//以下代码都是异步执行  demo请看 test1.html
/*
顺序执行 

*/
function sear(arr,call){
	if(!arr||!arr[0])return;
	!function run(i,para){
		if(i==arr.length){
			call(null,para);
			return;
		}
		arr[i](function(err,para){
			if(err!=null){
				call(err);
				return;
			}
			run(i+1,para);
		},para);	
	}(0);
}
//并列执行
function parall(arr,call){
	if(!arr||!arr[0])return;
	var r=[];rerr=null,passedIndex=0;
	for(var i=0,l=arr.length;i<l;i++){
		!function(t,i){
			t(function(err,p){
				if(rerr)return;
				if(err){
					rerr=err;
					call(rerr);
				}
				passedIndex++;
				r[i]=p;
				if(passedIndex==l&&rerr==null)call(null,r);
			});
		}(arr[i],i);
	}
}
//遍历 并列执行 结果反馈给回调
function map(arr,fn,call){
	if(Object.prototype.toString.call(arr)==='[object Array]'){
		var rs=[],rerr=null,num=1;
		for(var i=0,l=arr.length;i<l;i++){
			!function(t,i){
				fn(function(err,res){
					if(err)rerr=err;
					else rs[i]=res;
					if(num++==l)call(rerr,rs);
				},t,i);
			}(arr[i],i)
		}
	}else if(Object.prototype.toString.call(arr)==='[object Object]'){
		var keys=[],num=1,rs={},rerr=null;
		for(var key in arr)keys.push(key);
		for(var key in arr){
			!function(t,key){
				fn(function(err,res){
					if(err)rerr=err;
					else rs[key]=res;
					if(num++==keys.length)call(rerr,rs);
				},t,key);
			}(arr[key],key)
		}
	}
}
//遍历 序列执行 结果分级向下反馈
function mapsear(arr,fn,call){
	if(Object.prototype.toString.call(arr)==='[object Array]'){
		var rs=[],rerr=null,len=arr.length;
        !function run(i){
            if(i==len){
                call(null,rs);
                return;
            }
            var a=arr[i];
            fn(function(err,para){
                if(err){
                    call(err);
                    return;
                }
                rs[i]=para;
                run(i+1);
            },a,i);
        }(0);
	
	}else if(Object.prototype.toString.call(arr)==='[object Object]'){
		var keys=[],rs={};
		for(var key in arr)keys.push(key);
        var len=keys.length;
        !function run(i){
            if(i==len){
               call(null,rs);
               return;
            }
            var a=arr[keys[i]];
            fn(function(err,para){
                if(err){
                    call(err);
                    return;
                }
                rs[keys[i]]=para;
                run(i+1);
            },a,keys[i]);       
        }(0);
	}
}
/*
只运行一次函数
*/
function onefn(fn){
	var exec=false,r=null;
	return function(){
		if(exec)return r;
		exec=true;
		r=fn.apply(this,[].slice.call(arguments,0));
		return r;
	}
}
/*
 针对异步操作的回调
 var fn=onreq(function(call){
    request.....end
    call();
 });
 以上的fn调用多次只执行一次reqst....操作
*/
function onereq(fn){
    var exec=false,originfn,originfnArgs;
    return function(a,b,c){
        var nfn=function(){
            exec=true;
            originfnArgs=[].slice.call(arguments,0);
            originfn.apply(null,originfnArgs);
        };
        if(typeof c==="function"){
            originfn=c;
            c=nfn;
        }else if(typeof b==="function"){
            originfn=b;
            b=nfn;
        }else if(typeof a==="function"){
            originfn=a;
            a=nfn;
        }
        if(exec===false)fn(a,b,c);
        else originfn.apply(null,originfnArgs);

    }
}